package com.yupledu.reflection.question;

import com.yupledu.Cat;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author 余鹏龙
 * @version 1.0
 * 反射问题的引入
 */

@SuppressWarnings({"all"})
public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {

        //根据配置文件 re.properties 指定信息，创建Cat对象并调用方法hi
        //老余回忆

        //传统的方法 new 对象 -> 调用方法
//      Cat cat = new Cat();
//      cat.hi();   ==》 cat.cry() 修改源码

        //我们尝试做一做 -> 明白反射

        //1. 使用Properties 类，可以读写配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String method = properties.get("method").toString();
        System.out.println("classfullpath="+classfullpath);
        System.out.println("method="+method);

        //2.创建对象，传统的方法，行不通 -> 反射机制
        //new classfullpath();

        //3.使用反射进制解决
        //（1）加载类，返回Class类型的对象cls
        Class cls = Class.forName(classfullpath);
        //（2）通过 cls 得到你加载的类 com.yupledu.Cat 的对象实例
        Cat o = (Cat)cls.newInstance();
        System.out.println("o的运行类型=" + o.getClass());   //运行类型
        //（3）通过 cls 得到你加载的类 com.yupledu.Cat 的 methodName"hi" 的方法对象
        //    即：在反射钟，可以把方法视为对象（万物皆可对象）
        Method method1 = cls.getMethod(method);
        //（4）通过method1 调用方法：即通过方法对象来实现调用方法
        System.out.println("========================");
        method1.invoke(o);  //传统方法 对象.方法() ，反射机制 方法.invoke(对象)

    }
}
